package com.cy.pj.goods.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Repository
public class DefaultGoodsDao implements GoodsDao{

    @Autowired
    private DataSource dataSource;

    @Override
    public List<Map<String, Object>> findGoods() throws SQLException {

//        自己写的代码没有释放资源, 需要添加
        Connection conn = dataSource.getConnection();

        Statement stat = conn.createStatement();
        String sql = "select * from tb_goods";
        ResultSet rs = stat.executeQuery(sql);

//        获取元数据,  元数据: 描述数据的数据(即 数据表中的列名)
        ResultSetMetaData rsmd = rs.getMetaData();

        rsmd.getColumnName(1);//获取列的名称
        rsmd.getColumnLabel(1);//获取列的别名

        List<Map<String, Object>> list = new ArrayList<>();

        while(rs.next()){
//        高耦合的实现方法, 代码不能复用, 重复操作太多
/*            map = new HashMap();
            System.out.println(i++);
            map.put("id", rs.getInt("id"));
            map.put("name", rs.getString("name"));
            map.put("remark", rs.getString("remark"));
//            时间类型 使用 getTimestamp()方法来存储
            map.put("createdTime", rs.getTimestamp("createdTime"));
            list.add(map);*/

//            方法2 : 动态的实现, 低耦合, 可复用
/*            map = new HashMap();
            for (int i = 1; i <= rsmd.getColumnCount(); i++){
                map.put(rsmd.getColumnLabel(i), rs.getObject(i));
            }
            */

//            方法3:  写成函数,传入参数, 更加方便
            list.add(insertIntoMap(rsmd, rs));
        }


        rs.close();
        stat.close();
        conn.close();

        return list;
    }

    /**
     * 将结果集的所有结果动态的添加到Map中
     * @param rsmd 元数据集
     * @param rs 结果集
     * @return map类型
     * @throws SQLException 丢给上层处理
     *
     */
    public Map<String, Object> insertIntoMap(ResultSetMetaData rsmd, ResultSet rs) throws SQLException{
        HashMap map = new HashMap();
        for (int i = 1; i <= rsmd.getColumnCount(); i++){
            map.put(rsmd.getColumnLabel(i), rs.getObject(i));
        }
        return map;
    }
}
